/* 
 * File:   Repositorio.h
 * Author: gabilan
 *
 * Created on 24 de mayo de 2013, 19:33
 */

#ifndef REPOSITORIO_H
#define	REPOSITORIO_H

#include <string>
#include <iostream>
#include <vector>
#include <stdint.h>
#include "common_RepoItem.h"
#include "common_Excepcion.h"
#include "common_ISerializable.h"
#include "common_Mutex.h"
#include "common_MutexScopeLocker.h"

using namespace std;
using namespace TP;

namespace TP { namespace Archivos { 

#define VERSION_NULA 0
    
typedef vector<RepoItem*> SetRepoItem;

typedef vector<RepoItem*>::iterator SetRepoItemIterator;


class Repositorio : public ISerializable {

public:
    
    Repositorio (const string &pPath);
    
    virtual ~Repositorio();
    
    string GetPath() const{
        return this->_path;
    }
    
    void AgregarRepoItem(RepoItem * r){
        MutexScopeLocker locker (_lista_archs_Mutex);
        if (NULL != r)
        {
            r->SetFilePath(_path);
            this->lista_archs.push_back(r);    
        }
    }
    
    bool ExisteRepoItem(const string & filename);
    
    RepoItem * GetRepoItemByPath(const string & path);
    
    RepoItem * GetRepoItemByFilename(const string & filename);
    
    uint32_t GetVersion();
    
    uint32_t SetVersion (const uint32_t &pValor);
    
    string Serializar ();
    
    static Repositorio* Parse (const string& pXml);
    
    RepoItem* CrearItem();
    
    RepoItem* Primero ();
    
    RepoItem* Siguiente (RepoItem* pRepoItem);
    
    void EliminarItem (RepoItem* pRepoItem);
    
private:
    
    SetRepoItemIterator GetItemIterator();
    
    SetRepoItemIterator GetItemIteratorEnd();
    
    uint32_t _version;
    string _path;
    SetRepoItem lista_archs;
    Mutex _lista_archs_Mutex;
    
    // Constantes de serializacion 
    static std::string _rootNodeName;
    static std::string _versionNodeName;
    static std::string _pathNodeName;
    static std::string _listOfRepoItemNodeName;        
};

}}

#endif	/* REPOSITORIO_H */

